package com.syl.starter.itools.common.utils;

import com.syl.starter.itools.base.constants.BaseConstant;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;

import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 类型转换工具类
 *
 * @author syl
 * @create 2020-06-17 11:42
 **/
public class TypeConvertUtils {

    /**
     * 把excel单元格数据转换为java类型
     * @param cell excel 单元格
     * @return java object
     */
    public static Object convertCellValue(Cell cell) {
        if (cell == null || cell.toString().trim().equals(BaseConstant.EMPTY_STRING)) {
            return BaseConstant.EMPTY_STRING;
        }
        Object value = null;
        CellType cellType = cell.getCellType();
        if (CellType.BOOLEAN == cellType) {
            value = cell.getBooleanCellValue();
        } else if (CellType.ERROR == cellType) {
            value = cell.getErrorCellValue();
        } else if (CellType.FORMULA == cellType) {
            value = cell.getNumericCellValue();
        } else if (CellType.NUMERIC == cellType) {
            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                value = cell.getDateCellValue();
            } else {
                value = new DecimalFormat("0.########").format(cell.getNumericCellValue());
            }
        } else if (CellType.STRING == cellType) {
            value = StringUtils.trim(cell.getStringCellValue());
        }
        return value;
    }

    /**
     *
     * @param str 待转换的字符串
     * @param type 待转换类型
     * @return 转换后的
     */
    public static Object convertStringToObject(String str, Type type) {
        if (StringUtils.isEmptyStrong(str)) return null;
        String typeName = type.getTypeName();
        if (String.class.getTypeName().equals(typeName))
            return str;
        if (StringUtils.equalsAny(typeName, int.class.getTypeName(), Integer.class.getTypeName()))
            return Integer.parseInt(str);
        if (StringUtils.equalsAny(typeName, long.class.getTypeName(), Long.class.getTypeName()))
            return Long.parseLong(str);
        if (StringUtils.equalsAny(typeName, float.class.getTypeName(), Float.class.getTypeName()))
            return Float.parseFloat(str);
        if (StringUtils.equalsAny(typeName, double.class.getTypeName(), Double.class.getTypeName()))
            return Double.parseDouble(str);
        if (StringUtils.equalsAny(typeName, boolean.class.getTypeName(), Boolean.class.getTypeName()))
            return Boolean.parseBoolean(str);
        if (StringUtils.equalsAny(typeName, char.class.getTypeName(), Character.class.getTypeName()))
            return str.charAt(0);
        if (StringUtils.equalsAny(typeName, short.class.getTypeName(), Short.class.getTypeName()))
            return Short.parseShort(str);
        if (StringUtils.equalsAny(typeName, BigDecimal.class.getTypeName()))
            return new BigDecimal(str);
        return null;
    }

}
